package weixin

import (
	"encoding/json"
	"fmt"

	"gitee.com/shoyer/logger"
	"gitee.com/shoyer/service/config"
	"gitee.com/shoyer/util/http"
)

var (
	cc *Config
)

type Config struct {
}

// Init init locale
func Init(c *Config) error {
	cc = c
	return nil
}

func checkConfig() {
	if cc == nil {
		logger.Fatalf("weixin config not ok, pls check!!!")
	}
}

func GetAccessToken(suffix string) (token string, expire int, err error) {
	checkConfig()

	res := &TokenResponse{}
	err = Get(fmt.Sprintf("/cgi-bin/gettoken?corpid=%s&corpsecret=%s", config.GetWeixinCorpid(suffix), config.GetWeixinCorpsecret(suffix)), res, GetOptions(http.GET))
	if err != nil {
		err = fmt.Errorf("[weixin] suffix = %s GetAccessToken err: %s", suffix, err.Error())
		return
	}

	if res.ErrCode != OK {
		err = fmt.Errorf("[weixin] suffix = %s GetAccessToken err: code = %d, msg = %s", suffix, res.ErrCode, res.ErrMsg)
		return
	}

	return res.AccessToken, res.ExpiresIn, nil
}

type TokenResponse struct {
	Error
	AccessToken string `json:"access_token,omitempty"`
	ExpiresIn   int    `json:"expires_in,omitempty"`
}

func SendMsg(token string, req *SendMsgRequest) (res *SendMsgResponse, err error) {
	option := GetOptions(http.POST)
	body, err := json.Marshal(req)
	if err != nil {
		return
	}
	option.SetBody(body)

	res = &SendMsgResponse{}
	err = Post(fmt.Sprintf("/cgi-bin/message/send?access_token=%s", token), res, option)
	if err != nil {
		err = fmt.Errorf("[weixin] SendMsg err: %s", err.Error())
		return
	}

	if res.ErrCode != OK {
		err = fmt.Errorf("[weixin] SendMsg err: code = %d, msg = %s", res.ErrCode, res.ErrMsg)
		return
	}

	return
}

type SendMsgRequest struct {
	Touser                 string `json:"touser,omitempty"`                   // 指定接收消息的成员，成员ID列表（多个接收者用‘|’分隔，最多支持1000个）。特殊情况：指定为”@all”，则向该企业应用的全部成员发送
	Toparty                string `json:"toparty,omitempty"`                  // 指定接收消息的部门，部门ID列表，多个接收者用‘|’分隔，最多支持100个。当touser为”@all”时忽略本参数
	Totag                  string `json:"totag,omitempty"`                    // 指定接收消息的标签，标签ID列表，多个接收者用‘|’分隔，最多支持100个。当touser为”@all”时忽略本参数
	Msgtype                string `json:"msgtype,omitempty"`                  // 消息类型，此时固定为：text
	Agentid                string `json:"agentid,omitempty"`                  // 企业应用的id，整型。企业内部开发，可在应用的设置页面查看；第三方服务商，可通过接口 获取企业授权信息 获取该参数值
	Text                   Text   `json:"text,omitempty"`                     // 消息内容，最长不超过2048个字节，超过将截断（支持id转译）
	Safe                   string `json:"safe,omitempty"`                     // 表示是否是保密消息，0表示可对外分享，1表示不能分享且内容显示水印，默认为0
	EnableIdTrans          string `json:"enable_id_trans,omitempty"`          // 表示是否开启id转译，0表示否，1表示是，默认0。仅第三方应用需要用到，企业自建应用可以忽略。
	EnableDuplicateCheck   string `json:"enable_duplicate_check,omitempty"`   // 表示是否开启重复消息检查，0表示否，1表示是，默认0
	DuplicateCheckInterval string `json:"duplicate_check_interval,omitempty"` // 表示是否重复消息检查的时间间隔，默认1800s，最大不超过4小时
}

type Text struct {
	Content string `json:"content,omitempty"`
}

type SendMsgResponse struct {
	Error
	Msgid string `json:"msgid,omitempty"`
}
